package com.ys.io.IO流.p1编码与解码;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class Java字符串的编码和解码 {

    public static void main(String[] args) {

//         method01();
//         method02();

        method03();


    }

    /**
     * 指定范围的解码: 0 开始 6 个字节
     *String str = new String(gbks, 0,6,"GBK");
     */
    private static void method03() {
        try {
            // 1 指定格式编码:GBK
            byte[] gbks = "ys01杨胜22".getBytes("GBK");
            System.out.println(Arrays.toString(gbks));
            // 解码 GBK 解码 6 表示只解码6个字节 ys01 对应 4 个字节 杨就是两个字节
            //[121, 115, 48, 49, -47, -18, -54, -92, 50, 50]
            String str = new String(gbks, 0,6,"GBK");
            // 如果编码与解码方式是UTF-8 0-6 杨都解码不出来
            System.out.println("解码:\t"+str);
        }catch (Exception e){
            e.printStackTrace();
        }


    }

    /**
     * 指定格式的编码与解码:
     *  GBK 编码 UTF-8解码
     */
    private static void method02() {
        try {

            // 1 指定格式编码:GBK
            byte[] gbks = "ys01杨胜".getBytes("GBK");
            System.out.println(Arrays.toString(gbks));
            // 解码 UTF-8 解码
            String str = new String(gbks, "UTF-8");
            System.out.println("UTF-8解码:\t"+str);
            String str2 = new String(gbks, "GBK");
            System.out.println("GBK解码:\t"+str2);
            // 如果是 英文 西文 数字字符的编码 编码与解码格式不一样也没关系,因为其他编码都是在兼容ASCII 码的基础上扩展的
            // 如果是中文就会乱码
            /*
            *  乱码的原因: 就是编码 与 解码的方式不一致
            *  编码与解码应当一致
            * */

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    /**
     * 默认格式的 encoding 与 decode
     */
    private static void method01() {

        // 1: 将字符串 转为 字节数组
        // encode 编码
        byte[] bytes = "杨胜".getBytes();
        //   getBytes();  是默认调用 系统配置的当前的编码格式作为编码格式 String csn = Charset.defaultCharset().name();
        // 我们这里使用的idea 的默认配置就是utf-8 汉字占3个字节来描述位置  如果是GBK 环境汉字占两个字节
        System.out.println(Arrays.toString(bytes));
        // decode 解码
        // 2: 将字节数组 转为 字符串
        //  new String(bytes);  this.value = StringCoding.decode(bytes, offset, length);
        // String csn = Charset.defaultCharset().name();
        // 调用的是系统默认的编码格式 系统环境UTF-8
        String str = new String(bytes);
        System.out.println(str);
    }
}
